package fr.esisar.p2014.cs420.nsmwnr;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wb.swt.SWTResourceManager;

public class Commander {
	private Display display;

	protected Shell shell;
	private Text adresse;
	private Text prix;
	private Label lblName;
	private Button btnMonAdresse;
	private Button btnAutre;
	private Text profilAdresse;
	private Button btnSeDconnecter;
	private Button btnStatistiques;
	
	private Table tableAlbums;
	private TableColumn tblclmnTitreAlbum;
	private TableColumn tblclmnCommAlbum;
	private TableColumn tblclmnPhotosAlbum;
	private TableColumn tblclmnFormatAlbum;
	private TableColumn tblclmnQuantAlbum;
	private TableColumn tblclmnAuteurAlbum;
	private List<Text> textAlbum = new ArrayList<Text>();
	private List<CCombo> comboAlbum = new ArrayList<CCombo>();
	private TableItem[] itemsAlbum;
	private List<Integer> idAlbum = new ArrayList<Integer>();
	
	private Table tableLivres;
	private TableColumn tblclmnTitreLivre;
	private TableColumn tblclmnCommLivre;
	private TableColumn tblclmnPhotosLivre;
	private TableColumn tblclmnFormatLivre;
	private TableColumn tblclmnQuantLivre;
	private TableColumn tblclmnAuteurLivre;
	private List<Text> textLivre = new ArrayList<Text>();
	private List<CCombo> comboLivre = new ArrayList<CCombo>();
	private TableItem[] itemsLivre;
	private List<Integer> idLivre = new ArrayList<Integer>();

	List<String[]> formatAlbum = null;
	List<String[]> formatLivre = null;

	private List<String[]> itemsCommande = new ArrayList<String[]>();
	private String adresseLivraison;
	private String dateCommande;
	private Float prixCommande;
	
	Statement stmt;
	Connection conn;
	
	/**
	 * Constructeur d'origine
	 * @param display
	 */
	public Commander(){
		this.display = MainApp.display;
	}
	
	/**
	 * Renseigne sur le fait que la fenêtre est déjà ouverte ou non
	 * @return true si la fenêtre n'est pas déchargée de la mémoire
	 */
	public boolean estLance(){
		return shell != null && !shell.isDisposed();
	}
	
	/**
	 * Défini la fenêtre comme activ
	 */
	public void setActive(){
		if(shell == null || shell.isDisposed()) {
			createContents();
			shell.open();
			shell.layout();
		} else {
			rafraichir();
			shell.setActive();
		}	
	}

	/**
	 * Create contents of the window.
	 */
	/**
	 * @wbp.parser.entryPoint
	 */
	protected void createContents() {
		shell = new Shell(display, SWT.SHELL_TRIM & ~SWT.RESIZE & ~SWT.MAX);
		shell.setSize(790, 505);
		shell.setText("Commander");
		shell.setImage(MainApp.icone);
		shell.setLocation(display.getBounds().width / 2 - shell.getBounds().width / 2, display.getBounds().height / 2 - shell.getBounds().height / 2);
		
		Button btnRetour = new Button(shell, SWT.NONE);
		btnRetour.setBounds(10, 10, 75, 25);
		btnRetour.setText("Retour");
		
		btnSeDconnecter = new Button(shell, SWT.NONE);
		btnSeDconnecter.setBounds(681, 10, 93, 25);
		
		lblName = new Label(shell, SWT.NONE);
		lblName.setAlignment(SWT.RIGHT);
		lblName.setBounds(475, 15, 200, 15);
		
		Label label = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
		label.setBounds(0, 41, 784, 2);
		
		Label lblAlbums = new Label(shell, SWT.NONE);
		lblAlbums.setBounds(10, 49, 55, 15);
		lblAlbums.setText("Albums");
		
		tableAlbums = new Table(shell, SWT.CHECK | SWT.BORDER | SWT.FULL_SELECTION);
		tableAlbums.setBounds(10, 70, 764, 150);
		tableAlbums.setHeaderVisible(true);
		tableAlbums.setLinesVisible(true);
		
		tblclmnTitreAlbum = new TableColumn(tableAlbums, SWT.NONE);
		tblclmnTitreAlbum.setWidth(190);
		tblclmnTitreAlbum.setText("Titre");
		
		tblclmnAuteurAlbum = new TableColumn(tableAlbums, SWT.NONE);
		tblclmnAuteurAlbum.setWidth(100);
		tblclmnAuteurAlbum.setText("Auteur");
		
		tblclmnCommAlbum = new TableColumn(tableAlbums, SWT.NONE);
		tblclmnCommAlbum.setWidth(200);
		tblclmnCommAlbum.setText("Sous-titre");
		
		tblclmnPhotosAlbum = new TableColumn(tableAlbums, SWT.NONE);
		tblclmnPhotosAlbum.setWidth(50);
		tblclmnPhotosAlbum.setText("Photos");
		
		tblclmnFormatAlbum = new TableColumn(tableAlbums, SWT.NONE);
		tblclmnFormatAlbum.setWidth(150);
		tblclmnFormatAlbum.setText("Format");
		
		tblclmnQuantAlbum = new TableColumn(tableAlbums, SWT.NONE);
		tblclmnQuantAlbum.setWidth(50);
		tblclmnQuantAlbum.setText("Qté");
		
		Label lblLivres = new Label(shell, SWT.NONE);
		lblLivres.setBounds(10, 241, 55, 15);
		lblLivres.setText("Livres");
		
		tableLivres = new Table(shell,  SWT.CHECK | SWT.BORDER | SWT.FULL_SELECTION);
		tableLivres.setBounds(10, 262, 764, 150);
		tableLivres.setHeaderVisible(true);
		tableLivres.setLinesVisible(true);
		
		tblclmnTitreLivre = new TableColumn(tableLivres, SWT.NONE);
		tblclmnTitreLivre.setWidth(190);
		tblclmnTitreLivre.setText("Titre");
		
		tblclmnAuteurLivre = new TableColumn(tableLivres, SWT.NONE);
		tblclmnAuteurLivre.setWidth(100);
		tblclmnAuteurLivre.setText("Auteur");
		
		tblclmnCommLivre = new TableColumn(tableLivres, SWT.NONE);
		tblclmnCommLivre.setWidth(200);
		tblclmnCommLivre.setText("Sous-titre");
		
		tblclmnPhotosLivre = new TableColumn(tableLivres, SWT.NONE);
		tblclmnPhotosLivre.setWidth(50);
		tblclmnPhotosLivre.setText("Photos");
		
		tblclmnFormatLivre = new TableColumn(tableLivres, SWT.NONE);
		tblclmnFormatLivre.setWidth(150);
		tblclmnFormatLivre.setText("Format");
		
		tblclmnQuantLivre = new TableColumn(tableLivres, SWT.NONE);
		tblclmnQuantLivre.setWidth(50);
		tblclmnQuantLivre.setText("Qté");
		
		Label lblExpedier = new Label(shell, SWT.NONE);
		lblExpedier.setBounds(10, 421, 65, 15);
		lblExpedier.setText("Expédier à :");
		
		btnMonAdresse = new Button(shell, SWT.RADIO);
		btnMonAdresse.setSelection(true);
		btnMonAdresse.setBounds(81, 420, 93, 16);
		btnMonAdresse.setText("mon adresse :");
		
		btnAutre = new Button(shell, SWT.RADIO);
		btnAutre.setBounds(81, 448, 55, 16);
		btnAutre.setText("autre :");
		
		adresse = new Text(shell, SWT.BORDER);
		adresse.setEnabled(false);
		adresse.setBounds(178, 446, 450, 21);
		
		Label lblTotal = new Label(shell, SWT.NONE);
		lblTotal.setAlignment(SWT.RIGHT);
		lblTotal.setBounds(635, 421, 40, 15);
		lblTotal.setText("Total :");
		
		prix = new Text(shell, SWT.BORDER);
		prix.setEnabled(false);
		prix.setText("0,0 €");
		prix.setBounds(681, 417, 93, 21);
		
		Button btnCommander = new Button(shell, SWT.NONE);
		btnCommander.setBounds(662, 442, 112, 25);
		btnCommander.setText("Commander");
		
		profilAdresse = new Text(shell, SWT.BORDER);
		profilAdresse.setEnabled(false);
		profilAdresse.setBounds(178, 418, 450, 21);
		
		btnStatistiques = new Button(shell, SWT.NONE);
		btnStatistiques.setBounds(99, 10, 150, 25);
		btnStatistiques.setText("Afficher les statistiques");

		/* Bouton de statistiques */
		btnStatistiques.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent arg0) {
				MainApp.stats.setActive();
			}
		});
		
		/* Bouton de retour */
		btnRetour.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent arg0) {
				shell.dispose();
				MainApp.consult.setActive();
			}
		});
		
		/* Gestion des radioButton */
		btnAutre.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent arg0) {
				btnMonAdresse.setSelection(false);
				btnAutre.setSelection(true);
				adresse.setEnabled(true);
			}
		});
		btnMonAdresse.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent arg0) {
				btnAutre.setSelection(false);
				btnMonAdresse.setSelection(true);
				adresse.setEnabled(false);
			}
		});
		
		/* Action du bouton de connexion */
		btnSeDconnecter.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent arg0) {

				if(MainApp.idClient == 0){
					MainApp.conn.setActive();
				}else{
					MainApp.conn.deconnecter();
				}
				
				rafraichir();
			}
		});
		
		/* Gestion des sélections dans les tables */
		tableAlbums.addListener(SWT.Selection, new Listener() {
			
			@Override
			public void handleEvent(Event arg0) {
				if (arg0.detail == SWT.CHECK) {
					for (int i = 0 ; i < itemsAlbum.length ; i++) {
						if (itemsAlbum[i].getChecked() && Integer.valueOf(textAlbum.get(i).getText()) <= 0) textAlbum.get(i).setText("1");
						else if (!itemsAlbum[i].getChecked() && Integer.valueOf(textAlbum.get(i).getText()) > 0) textAlbum.get(i).setText("0");
					}
				}
				updatePrice();
			}
		});
		tableLivres.addListener(SWT.Selection, new Listener() {
			
			@Override
			public void handleEvent(Event arg0) {
				if (arg0.detail == SWT.CHECK) {
					for (int i = 0 ; i < itemsLivre.length ; i++) {
						if (itemsLivre[i].getChecked() && Integer.valueOf(textLivre.get(i).getText()) <= 0) textLivre.get(i).setText("1");
						else if (!itemsLivre[i].getChecked() && Integer.valueOf(textLivre.get(i).getText()) > 0) textLivre.get(i).setText("0");
					}
				}
				updatePrice();
			}
		});
		
		/* Action du bouton commander */
		btnCommander.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent arg0) {
				MessageBox dialog;
				
				/* Le client doit être connecté */
				if (MainApp.idClient == 0) {
					dialog = new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK);
					dialog.setText("Connexion requise");
					dialog.setMessage("Seuls les utilisateurs connectés peuvent commander,\nmerci de vous connecter.");
					dialog.open();
					MainApp.conn.setActive();
					return;
				}
				
				/* Vérification que des lignes sont sélectionnées */
				boolean selection = false;
				for (TableItem item : itemsAlbum) {
					if (item.getChecked()) selection = true;
				}
				for (TableItem item : itemsLivre) {
					if (item.getChecked()) selection = true;
				}
				if (!selection) {
					dialog = new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK);
					dialog.setText("Sélection invalide");
					dialog.setMessage("Vous n'avez sélectionné aucun album ou livre.");
					dialog.open();
					return;
				}

				/* Confirmation de l'action */
				dialog = new MessageBox(shell, SWT.ICON_INFORMATION | SWT.YES | SWT.NO);
				dialog.setText("Confirmer la commande");
				dialog.setMessage("Vous êtes sur le point de passer commande, cette action est irréversible.\nEtes-vous sûr de vouloir continuer ?");
				int answer = dialog.open();
				if (answer == SWT.NO) return;
				
				Commande resume = null;
				int ncomm = 0;
				boolean erreur = false;
				
				try {
					ncomm = enregistrerCommade();
				} catch (Exception e) {
					try {
						conn.rollback();
					} catch (SQLException e1) {
						MainApp.erreurBase("Il est intervenu une erreur lors de l'enregistrement de votre commande.\nAucun des articles ne vous a été facturé, veuillez réessayer plus tard.\n\n" + e1.getMessage());
					}
				}
				updatePrice();	// met à jour prixCommande
			
				// Affichage du résumé
				resume = new Commande(ncomm, itemsCommande, adresseLivraison, dateCommande, prixCommande);
				resume.setActive();
				resume.go();
				
				String message = genererMail(ncomm);
				
				try {
					envoyerMail(message, ncomm);
				} catch (Exception e) {
					resume.erreur();
					erreur = true;
				}
				
				if (!erreur) resume.stop();
			}
		});
		
		
			rafraichir();
	}
	
	/**
	 * Raffraichis l'affichage en fonction des différents cas de figure, notemment connexion / déconnexion, et ouverture de la fenêtre
	 */
	protected void rafraichir() {
		/* On nettoie l'affichage */
		tableAlbums.removeAll();
		tableLivres.removeAll();
		idAlbum.removeAll(idAlbum);
		idLivre.removeAll(idLivre);
		for (Text i : textAlbum) {
			i.dispose();
		}
		textAlbum.removeAll(textAlbum);
		for (Text i : textLivre) {
			i.dispose();
		}
		textLivre.removeAll(textLivre);
		for (CCombo i : comboAlbum) {
			i.dispose();
		}
		comboAlbum.removeAll(comboAlbum);
		for (CCombo i : comboLivre) {
			i.dispose();
		}
		comboLivre.removeAll(comboLivre);
		
		prix.setText("0 €");
		adresse.setText("");
		btnMonAdresse.setSelection(true);
		btnAutre.setSelection(false);
		
		btnStatistiques.setVisible(false);
		
		/* Si le client n'est pas connecté il doit le faire */
		if (MainApp.idClient == 0) {
			btnSeDconnecter.setText("Se connecter");
			lblName.setText("Connectez vous :");
			lblName.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
			profilAdresse.setText("");
			return;
		}
		
		// L'entête de la fenêtre
		btnSeDconnecter.setText("Se déconnecter");
		lblName.setText(MainApp.prenom + " " + MainApp.nom);
		lblName.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK));
		profilAdresse.setText(MainApp.adresse);
		if (MainApp.estAdmin) btnStatistiques.setVisible(true);

		/* Interrogation de la base */
		try {
			Connection conn = JDBC.getInstance().getConnection();
			stmt = conn.createStatement();
			conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

			String req;
			ResultSet rset;
			
			// Les formats d'albums
			if (formatAlbum == null) {
				req = "SELECT idFormat, libelle, prix FROM Format WHERE type LIKE 'Album'";
				rset = stmt.executeQuery(req);
				
				formatAlbum = new ArrayList<String[]>();
				while (rset.next()) {
					String[] ligne = new String[3];
					ligne[0] = rset.getString(1);	// idFormat
					ligne[1] = rset.getString(2);	// libellé
					ligne[2] = rset.getString(3);	// prix
					formatAlbum.add(ligne);
				}
			}
			
			// Les formats de livres
			if (formatLivre == null) {
				req = "SELECT idFormat, libelle, prix FROM Format WHERE type LIKE 'Livre'";
				rset = stmt.executeQuery(req);
	
				formatLivre = new ArrayList<String[]>();
				while (rset.next()) {
					String[] ligne = new String[3];
					ligne[0] = rset.getString(1);	// idFormat
					ligne[1] = rset.getString(2);	// libellé
					ligne[2] = rset.getString(3);	// prix
					formatLivre.add(ligne);
				}
			}
			
			// La table albums
			req = "SELECT Album.idAlbum, Album.Titre, Client.Nom, Album.SousTitre, COUNT(Contient.idPhoto) "
						+	"FROM Album, Contient, Client "
						+	"WHERE ((Album.IDCLIENT = "  + MainApp.idClient + ") OR (Album.Partage LIKE 'o')) "
						+	"AND Contient.idAlbum = Album.idAlbum "
						+	"AND Client.idClient = Album.idClient "
						+	"AND Album.idAlbum NOT IN (SELECT Livre.idAlbum FROM Livre) "
						+	"GROUP BY Album.idAlbum, Album.titre, Album.soustitre, Client.nom "
						+	"ORDER BY Album.Titre";
			rset = stmt.executeQuery(req);
			
			
			/* Mise en forme de l'affichage des tables : ALBUMS */
			while (rset.next()){
				TableItem item = new TableItem(tableAlbums, SWT.NONE);
				item.setText(new String[]{rset.getString(2), rset.getString(3), rset.getString(4), rset.getString(5)});
				// Sauvegarde de l'ID de l'album
				idAlbum.add(rset.getInt(1));
			}
			
			itemsAlbum = tableAlbums.getItems();
			
			// Ajout des combos
			for (int i = 0 ; i < itemsAlbum.length ; i++) {
				TableEditor editor = new TableEditor(tableAlbums);
				CCombo combo = new CCombo(tableAlbums, SWT.NONE);
				comboAlbum.add(combo);
				combo.setEditable(false);
				combo.addSelectionListener(new SelectionListener() {
					int index = -1;
					
					@Override
					public void widgetSelected(SelectionEvent arg0) {
						if (index < 0) index = comboAlbum.indexOf(((CCombo) arg0.getSource()));
						
						itemsAlbum[index].setChecked(true);
						if (Integer.valueOf(textAlbum.get(index).getText()) < 1) textAlbum.get(index).setText("1");
						
						updatePrice();
					}
					
					@Override
					public void widgetDefaultSelected(SelectionEvent arg0) {
						
					}
				});
				
				for (int j = 0 ; j < formatAlbum.size() ; j++)
					combo.add(formatAlbum.get(j)[1] + " " + formatAlbum.get(j)[2] + "€");
	
				combo.select(0);
				
				editor.grabHorizontal = true;
				editor.setEditor(combo, itemsAlbum[i], 4);
			}
			
			// Ajout des textbox
			for (int i = 0 ; i < itemsAlbum.length ; i++) {
				TableEditor editor = new TableEditor(tableAlbums);
				Text text = new Text(tableAlbums, SWT.NONE);
				text.setText("0");
				textAlbum.add(text);
				
				text.addKeyListener(new KeyListener() {
					int value = 0;
					int index = -1;
					
					@Override
					public void keyReleased(KeyEvent arg0) {
						if (index < 0) index = textAlbum.indexOf(((Text) arg0.getSource()));
						
						try {
							if (Integer.valueOf(((Text) arg0.getSource()).getText()) == 0) {
								itemsAlbum[index].setChecked(false);
								value = Integer.valueOf(((Text) arg0.getSource()).getText());
							} else if (Integer.valueOf(((Text) arg0.getSource()).getText()) > 0) {
								itemsAlbum[index].setChecked(true);
								value = Integer.valueOf(((Text) arg0.getSource()).getText());
							} else {
								value = 0;
								itemsAlbum[index].setChecked(false);
								((Text) arg0.getSource()).setText(String.valueOf(value));
							}
						} catch (Exception e) {
							((Text) arg0.getSource()).setText(String.valueOf(value));
						}
						
						updatePrice();
					}
					
					@Override
					public void keyPressed(KeyEvent arg0) {
						
					}
				});
				
				editor.grabHorizontal = true;
				editor.setEditor(text, itemsAlbum[i], 5);
			}
	
			
			// La table livres
			req = "SELECT Livre.IDALBUM, Album.TITRE, Client.nom, Album.SOUSTITRE, count(Contient.idPhoto) "
						+	"FROM Album, Livre, Contient, Client "
						+	"WHERE ((Album.IDCLIENT = "  + MainApp.idClient + ") OR (Album.PARTAGE = 'o')) "
						+	"AND Contient.idAlbum = Album.idAlbum "
						+	"AND Album.idAlbum = Livre.idAlbum "
						+	"AND Client.idClient = Album.idClient "
						+	"GROUP BY Livre.idAlbum, Album.titre, Album.soustitre, Client.nom "
						+	"ORDER BY Album.Titre";
			rset = stmt.executeQuery(req);
			
			/* Mise en forme de l'affichage des tables : LIVRES */
			while (rset.next()){
				TableItem item = new TableItem(tableLivres, SWT.NONE);
				item.setText(new String[]{rset.getString(2), rset.getString(3), rset.getString(4), rset.getString(5)});
				// Sauvegarde de l'ID du livre
				idLivre.add(rset.getInt(1));
			}
	
			itemsLivre = tableLivres.getItems();
			
			// Ajout des combos
			for (int i = 0 ; i < itemsLivre.length ; i++) {
				TableEditor editor = new TableEditor(tableLivres);
				CCombo combo = new CCombo(tableLivres, SWT.NONE);
				comboLivre.add(combo);
				combo.setEditable(false);
				combo.addSelectionListener(new SelectionListener() {
					int index = -1;
					
					@Override
					public void widgetSelected(SelectionEvent arg0) {
						if (index < 0) index = comboLivre.indexOf(((CCombo) arg0.getSource()));
						
						itemsLivre[index].setChecked(true);
						if (Integer.valueOf(textLivre.get(index).getText()) < 1) textLivre.get(index).setText("1");
						
						updatePrice();
					}
					
					@Override
					public void widgetDefaultSelected(SelectionEvent arg0) {
						
					}
				});
				
				for (int j = 0 ; j < formatLivre.size() ; j++)
					combo.add(formatLivre.get(j)[1] + " " + formatAlbum.get(j)[2] + "€");
				
				combo.select(0);
				
				editor.grabHorizontal = true;
				editor.setEditor(combo, itemsLivre[i], 4);
			}
			
			// Ajout des textbox
			for (int i = 0 ; i < itemsLivre.length ; i++) {
				TableEditor editor = new TableEditor(tableLivres);
				Text text = new Text(tableLivres, SWT.NONE);
				text.setText("0");
				textLivre.add(text);
				
				text.addKeyListener(new KeyListener() {
					int index = -1;
					int value = 0;
					
					@Override
					public void keyReleased(KeyEvent arg0) {
						if (index < 0) index = textLivre.indexOf(((Text) arg0.getSource()));
						
						try {
							if (Integer.valueOf(((Text) arg0.getSource()).getText()) >= 0) {
								itemsLivre[index].setChecked(true);
								value = Integer.valueOf(((Text) arg0.getSource()).getText());
							} else {
								value = 0;
								itemsLivre[index].setChecked(false);
								((Text) arg0.getSource()).setText(String.valueOf(value));
							}
						} catch (Exception e) {
							((Text) arg0.getSource()).setText(String.valueOf(value));
						}
						
						updatePrice();
					}
					
					@Override
					public void keyPressed(KeyEvent arg0) {
	
					}
				});
				
				editor.grabHorizontal = true;
				editor.setEditor(text, itemsLivre[i], 5);
			}

			rset.close();
			stmt.close();
			conn.commit();
			conn.close();
		
		} catch (SQLException e1) {
			try {
				conn.rollback();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			MainApp.erreurBase("Il est intervenu une erreur lors de la récupération des informations nécessaires à la commande.\nVeuillez nous excuser et réessayer plus tard.\n\n" + e1.getMessage());
		}
	}
	
	/**
	 * Met à jour l'affichage du prix, ainsi que prixCommande
	 */
	private void updatePrice() {
		prixCommande = 0F;
		
		for (int  i = 0 ; i < itemsAlbum.length ; i++) {
			if (itemsAlbum[i].getChecked()) {
				int comboIndex = comboAlbum.get(i).getSelectionIndex();
				int quantite;
				
				try {
					quantite = Integer.valueOf(textAlbum.get(i).getText());
					prixCommande += Float.valueOf(formatAlbum.get(comboIndex)[2]) * quantite;
				} catch (Exception e) {
					
				}
			}
		}		
		for (int  i = 0 ; i < itemsLivre.length ; i++) {
			if (itemsLivre[i].getChecked()) {
				int comboIndex = comboLivre.get(i).getSelectionIndex();
				int quantite;
				
				try {
					quantite = Integer.valueOf(textLivre.get(i).getText());
					prixCommande += Float.valueOf(formatLivre.get(comboIndex)[2]) * quantite;
				} catch (Exception e) {
					
				}
			}
		}
		
		prix.setText(String.valueOf(prixCommande) + " €");
	}
	
	/**
	 * Envoie le mail de confirmation de la commande
	 * @throws Exception 
	 */
	private static void envoyerMail(String textmail, int noCommande) throws Exception {
		
		/* Initialisation des propriétés */
		Properties prop = System.getProperties();
		prop.put("mail.smtp.host", "smtp.gmail.com");
		prop.put("mail.smtp.port", 587);
		prop.put("mail.smtp.auth", "true");
		prop.put("mail.smtp.starttls.enable","true");
		Session session = Session.getDefaultInstance(prop);
		
		/* Création du corps du message */
		Message message = new MimeMessage(session);
		message.setFrom(new InternetAddress("userir.cs420@gmail.com"));		// FROM
		
		InternetAddress[] internetAddresses = new InternetAddress[1];		// TO
		internetAddresses[0] = new InternetAddress(MainApp.mail);
		message.setRecipients(Message.RecipientType.TO, internetAddresses);
		
		message.setSubject("Récapitulatif de votre commande n°" + noCommande);
		message.setContent(textmail, "text/html");		// Pour mettre du HTML
		
		message.setHeader("X-Mailer", "CS420_MiniProjet");
		message.setSentDate(new Date());
		session.setDebug(false);
		
		/* Création de la connexion TLS et envoi du message */
		Transport transport = session.getTransport("smtp");
        transport.connect("smtp.gmail.com","userir.cs420@gmail.com", "userircs420");	// SMTP, USERNAME, PASSWORD
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
	
	}
	
	/**
	 * Génère le corps de l'email à envoyer
	 * @param nCommande le numéro de la commande
	 * @return le corps mis en forme du message
	 */
	private String genererMail (int noCommande) {
		Date date = new Date();
		DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		String today = dateFormat.format(date);
		String adresseEnvoi = ((btnMonAdresse.getSelection() || adresse.getText().trim().length() == 0)? profilAdresse.getText() : adresse.getText());
		adresseEnvoi = org.apache.commons.lang3.StringEscapeUtils.escapeHtml4(adresseEnvoi);	// échappe les caracètres indésirables en HTML
		
		String message = new String("<h1 style=\"border: 1px solid purple; background-color: rgb(210, 159, 240);\">Ce message vous confirme la commande n&ordm;" + noCommande + " pass&eacute;e aupr&egrave;s de nos services.</h1>\n");
		
		message += "<br/><h2>Elle sera envoy&eacute;e &agrave; l&rsquo;adresse : <em>" + adresseEnvoi + "</em></h2>\n\n";
		
		message += "<br/><h2>Voici le r&eacute;sum&eacute; de la commande pass&eacute;e le " + today + " :</h2>\n\n";
		
		// Parcours des albums
		String messageTemp = new String("");
					
		for (int  i = 0 ; i < itemsAlbum.length ; i++) {
			if (itemsAlbum[i].getChecked()) {
				int comboIndex = comboAlbum.get(i).getSelectionIndex();
				int quantite;
				
				messageTemp += "<tr>\n";
				messageTemp += "<td style=\"border: 1px solid black;\">" + org.apache.commons.lang3.StringEscapeUtils.escapeHtml4(itemsAlbum[i].getText(0)) + "</td>\n";
				messageTemp += "<td style=\"border: 1px solid black;\">" + org.apache.commons.lang3.StringEscapeUtils.escapeHtml4(itemsAlbum[i].getText(1)) + "</td>\n";
				
				try {
					quantite = Integer.valueOf(textAlbum.get(i).getText());
					
					messageTemp += "<td style=\"border: 1px solid black;\">" + String.valueOf(quantite) + "</td>\n";
					messageTemp += "<td style=\"border: 1px solid black;\">" + org.apache.commons.lang3.StringEscapeUtils.escapeHtml4(formatAlbum.get(comboIndex)[1]) + "</td>\n";
					messageTemp += "<td style=\"border: 1px solid black;\">" + Float.valueOf(formatAlbum.get(comboIndex)[2]) * quantite + " &euro;</td>\n";
					
				} catch (Exception e) {
					e.printStackTrace();
				}

				messageTemp += "</tr>\n";
			}
		}
		
		if (messageTemp.length() > 0) {
			message += "<br/><h3>Elle concerne les ALBUMS :</h3>\n";
			message += "<table style=\"border-collapse: collapse;\">\n<tr>"
				       + "<th style=\"border: 1px solid black; text-align: center; min-width: 150px;\">Titre</th>"
				       + "<th style=\"border: 1px solid black; text-align: center; min-width: 150px;\">Auteur</th>"
				       + "<th style=\"border: 1px solid black; text-align: center; min-width: 150px;\">Quantit&eacute;</th>"
				       + "<th style=\"border: 1px solid black; text-align: center; min-width: 150px;\">Format</th>"
				       + "<th style=\"border: 1px solid black; text-align: center; min-width: 150px;\">Prix Total</th>"
				       + "</tr>";
			message += messageTemp;
			message += "</table>\n";
		}
		
		// Parcours des livres
		messageTemp = new String("");

		for (int  i = 0 ; i < itemsLivre.length ; i++) {
			if (itemsLivre[i].getChecked()) {
				int comboIndex = comboLivre.get(i).getSelectionIndex();
				int quantite;
				
				messageTemp += "<tr>\n";
				messageTemp += "<td style=\"border: 1px solid black;\">" + org.apache.commons.lang3.StringEscapeUtils.escapeHtml4(itemsLivre[i].getText(0)) + "</td>\n";
				messageTemp += "<td style=\"border: 1px solid black;\">" + org.apache.commons.lang3.StringEscapeUtils.escapeHtml4(itemsLivre[i].getText(1)) + "</td>\n";
				
				try {
					quantite = Integer.valueOf(textLivre.get(i).getText());
					
					messageTemp += "<td style=\"border: 1px solid black;\">" + String.valueOf(quantite) + "</td>\n";
					messageTemp += "<td style=\"border: 1px solid black;\">" + org.apache.commons.lang3.StringEscapeUtils.escapeHtml4(formatLivre.get(comboIndex)[1]) + "</td>\n";
					messageTemp += "<td style=\"border: 1px solid black;\">" + Float.valueOf(formatLivre.get(comboIndex)[2]) * quantite + " &euro;</td>\n";
					
				} catch (Exception e) {
					e.printStackTrace();
				}

				messageTemp += "</tr>\n";
			}
		}
		
		if (messageTemp.length() > 0) {
			message += "\n<br/><h3>Elle concerne les LIVRES :</h3>\n";
			message += "<table style=\"border-collapse: collapse;\">\n<tr>"
				       + "<th style=\"border: 1px solid black; text-align: center; min-width: 150px;\">Titre</th>"
				       + "<th style=\"border: 1px solid black; text-align: center; min-width: 150px;\">Auteur</th>"
				       + "<th style=\"border: 1px solid black; text-align: center; min-width: 150px;\">Quantit&eacute;</th>"
				       + "<th style=\"border: 1px solid black; text-align: center; min-width: 150px;\">Format</th>"
				       + "<th style=\"border: 1px solid black; text-align: center; min-width: 150px;\">Prix Total</th>"
				       + "</tr>";
			message += messageTemp;
			message += "</table>\n";
		}

		message += "\n<br/><h2 style=\"border: 1px solid purple; background-color: rgb(255, 128, 128);\">Prix Global : " + prixCommande + " &euro;</h2>";
		
		return message;
	}
	
	/**
	 * Envoie la commande dans la base de données
	 * @return le numéro de la commande enregistrée
	 * @throws SQLException 
	 */
	private int enregistrerCommade() throws SQLException {
		/* Récupération des informations de commande, et ajout à la base */
		int nbComm = -1;
		adresseLivraison = ((btnMonAdresse.getSelection() || adresse.getText().trim().length() == 0)? profilAdresse.getText() : adresse.getText());

		conn = JDBC.getInstance().getConnection();
		conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);		// peut lire les données commitées avant la transaction, et celles créées par celle-ci
		stmt = conn.createStatement();
		
		String req;
		ResultSet rset = null;
		
		itemsCommande.removeAll(itemsCommande);
		
		// Ajout de la commande
		Date date = new Date();
		DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		dateCommande = dateFormat.format(date);
		
		req = "INSERT INTO Commande(idClient, dateCommande, adresseLivraison) VALUES ("
				+ MainApp.idClient + ", '"
				+ dateCommande + "', '"
				+ adresseLivraison.replace('\'', '_')
				+ "')";
		stmt.executeUpdate(req);
		
		// Récupération de l'identifiant
		req = "SELECT SCommande.currval FROM dual";
		rset = stmt.executeQuery(req);
		if (rset.next()) {
			nbComm = rset.getInt(1);
		}
		
		// Ajout des albums commandés
		for (int  i = 0 ; i < itemsAlbum.length ; i++) {
			if (itemsAlbum[i].getChecked()) {
				int comboIndex = comboAlbum.get(i).getSelectionIndex();

				int quantite = Integer.valueOf(textAlbum.get(i).getText());				// quantité de la ligne
				float prix = Float.valueOf(formatAlbum.get(comboIndex)[2]);				// prix par tirage
				
				// Ajout d'une ligne de commande
				req = "INSERT INTO LigneCommande(idCommande, idAlbum, idFormat, quantite, prixParTirage, titre) VALUES ("
						+ String.valueOf(nbComm) + ", "
						+ String.valueOf(idAlbum.get(i)) + ", "
						+ String.valueOf(formatAlbum.get(comboIndex)[0]) + ", "
						+ String.valueOf(quantite) + ", "
						+ String.valueOf(prix) + ", '"
						+ itemsAlbum[i].getText(0)
						+ "')";
				stmt.executeUpdate(req);
				
				// Ligne de Commande pour l'affichage
				itemsCommande.add(new String[]{itemsAlbum[i].getText(0), itemsAlbum[i].getText(1), "Album, " + formatAlbum.get(comboIndex)[1], String.valueOf(quantite), String.valueOf(prix) + " €"});
			}
		}
		
		for (int  i = 0 ; i < itemsLivre.length ; i++) {
			if (itemsLivre[i].getChecked()) {
				int comboIndex = comboLivre.get(i).getSelectionIndex();

				int quantite = Integer.valueOf(textLivre.get(i).getText());				// quantité de la ligne
				float prix = Float.valueOf(formatLivre.get(comboIndex)[2]);				// prix par tirage
				
				// Ajout d'une ligne de commande
				req = "INSERT INTO LigneCommande(idCommande, idAlbum, idFormat, quantite, prixParTirage, titre) VALUES ("
						+ String.valueOf(nbComm) + ", "
						+ String.valueOf(idLivre.get(i)) + ", "
						+ String.valueOf(formatLivre.get(comboIndex)[0]) + ", "
						+ String.valueOf(quantite) + ", "
						+ String.valueOf(prix) + ", '"
						+ itemsLivre[i].getText(0)
						+ "')";
				stmt.executeUpdate(req);

				// Ligne de Commande pour l'affichage
				itemsCommande.add(new String[]{itemsLivre[i].getText(0), itemsLivre[i].getText(1), "Livre, " + formatLivre.get(comboIndex)[1], String.valueOf(quantite), String.valueOf(prix) + " €"});
			}
		}

		if (rset != null) rset.close();
		stmt.close();
		conn.commit();
		conn.close();
		
		return nbComm;
	}
}
